#include <iostream>
#include <vector>
#include <queue>
#include <climits>
using namespace std;

struct Edge {
    int to;
    int weight;
};

int main() {
    int n, m;
    cin >> n >> m;
    
    vector<vector<Edge>> graph(n + 1);
    vector<int> indegree(n + 1, 0);
    
    // 构建图和入度数组
    for (int i = 0; i < m; i++) {
        int u, v, w;
        cin >> u >> v >> w;
        graph[u].push_back({v, w});
        indegree[v]++;
    }
    
    // 初始化dp数组，用INT_MIN表示不可达
    vector<int> dp(n + 1, INT_MIN);
    dp[1] = 0;  // 起点到自己的距离为0
    
    // 拓扑排序
    queue<int> q;
    
    // 将所有入度为0的节点加入队列（从起点1开始）
    for (int i = 1; i <= n; i++) {
        if (indegree[i] == 0) {
            q.push(i);
        }
    }
    
    while (!q.empty()) {
        int u = q.front();
        q.pop();
        
        // 遍历u的所有出边
        for (const Edge& edge : graph[u]) {
            int v = edge.to;
            int w = edge.weight;
            
            // 如果u可达，则更新v的最长路径
            if (dp[u] != INT_MIN) {
                dp[v] = max(dp[v], dp[u] + w);
            }
            
            // 减少v的入度，如果入度为0则加入队列
            indegree[v]--;
            if (indegree[v] == 0) {
                q.push(v);
            }
        }
    }
    
    // 输出结果
    if (dp[n] == INT_MIN) {
        cout << -1 << endl;
    } else {
        cout << dp[n] << endl;
    }
    
    return 0;
}